package br.com.ufpr.util.feedback;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;

import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.LoadableDetachableModel;

import br.com.sebrae.pr.sgp.util.exceptions.TipoErro;


/**
 * Painel customizado para exibição de mensagens de erro.
 * 
 * @author Willian Tanaka
 */
public class CustomFeedbackPanel extends Panel {
    private static final long serialVersionUID = 6405691536494797799L;

    private final HashMap<TipoErro, LinkedList<String>> mapMensagens = new LinkedHashMap<TipoErro, LinkedList<String>>();

    private final WebMarkupContainer wmcListAlerta = new WebMarkupContainer("wmcListAlerta");
    private final ListView<String> listAlerta = new ListView<String>("listAlerta", new LoadableDetachableModel<List<String>>() {
        private static final long serialVersionUID = -6350420421839090876L;

        @Override
        protected List<String> load() {
            return mapMensagens.get(TipoErro.ALERTA);
        }
    }) {
        private static final long serialVersionUID = -3670041148543776054L;

        @Override
        protected void populateItem(ListItem<String> item) {
            item.add(new Label("msg", item.getModelObject()).setEscapeModelStrings(false));
        }

    };

    private final WebMarkupContainer wmcListAviso = new WebMarkupContainer("wmcListAviso");
    private final ListView<String> listAviso = new ListView<String>("listAviso", new LoadableDetachableModel<List<String>>() {
        private static final long serialVersionUID = -8734024137582132687L;

        @Override
        protected List<String> load() {
            return mapMensagens.get(TipoErro.AVISO);
        }
    }) {
        private static final long serialVersionUID = 2668845839906583637L;

        @Override
        protected void populateItem(ListItem<String> item) {
            item.add(new Label("msg", item.getModelObject()).setEscapeModelStrings(false));
        }

    };

    private final WebMarkupContainer wmcListErro = new WebMarkupContainer("wmcListErro");
    private final ListView<String> listErro = new ListView<String>("listErro", new LoadableDetachableModel<List<String>>() {
        private static final long serialVersionUID = 5770543292241036670L;

        @Override
        protected List<String> load() {
            return mapMensagens.get(TipoErro.ERRO);
        }
    }) {
        private static final long serialVersionUID = 3079372483802870789L;

        @Override
        protected void populateItem(ListItem<String> item) {
            item.add(new Label("msg", item.getModelObject()).setEscapeModelStrings(false));
        }

    };

    private final WebMarkupContainer wmcListSuccess = new WebMarkupContainer("wmcListSuccess");
    private final ListView<String> listSucesso = new ListView<String>("listSucesso", new LoadableDetachableModel<List<String>>() {
        private static final long serialVersionUID = -1182224480451893871L;

        @Override
        protected List<String> load() {
            return mapMensagens.get(TipoErro.SUCESSO);
        }
    }) {
        private static final long serialVersionUID = 6912826263695484363L;

        @Override
        protected void populateItem(ListItem<String> item) {
            item.add(new Label("msg", item.getModelObject()).setEscapeModelStrings(false));
        }

    };

    public CustomFeedbackPanel(final String id) {
        super(id);

        setOutputMarkupId(true);
        setOutputMarkupPlaceholderTag(true);

        wmcListAlerta.add(listAlerta);
        wmcListAlerta.setVisible(mapMensagens.get(TipoErro.ALERTA) != null && mapMensagens.get(TipoErro.ALERTA).size() > 0);
        add(wmcListAlerta);

        wmcListAviso.add(listAviso);
        wmcListAviso.setVisible(mapMensagens.get(TipoErro.AVISO) != null && mapMensagens.get(TipoErro.AVISO).size() > 0);
        add(wmcListAviso);

        wmcListErro.add(listErro);
        wmcListErro.setVisible(mapMensagens.get(TipoErro.ERRO) != null && mapMensagens.get(TipoErro.ERRO).size() > 0);
        add(wmcListErro);

        wmcListSuccess.add(listSucesso);
        wmcListSuccess.setVisible(mapMensagens.get(TipoErro.SUCESSO) != null && mapMensagens.get(TipoErro.SUCESSO).size() > 0);
        add(wmcListSuccess);

        setVisible(listAlerta.isVisible() || listAviso.isVisible() || listErro.isVisible() || listSucesso.isVisible());
    }

    public void adicionaMensagem(final TipoErro tipoErro, final String mensagem) {
        if (!mapMensagens.containsKey(tipoErro)) {
            mapMensagens.put(tipoErro, new LinkedList<String>());
        }
        mapMensagens.get(tipoErro).addLast(mensagem);
    }

    @Override
    protected void onAfterRender() {
        super.onAfterRender();
        mapMensagens.clear();
    }

    public void atualizaPanel(final AjaxRequestTarget target) {
        wmcListAlerta.setVisible(mapMensagens.get(TipoErro.ALERTA) != null && mapMensagens.get(TipoErro.ALERTA).size() > 0);

        wmcListAviso.setVisible(mapMensagens.get(TipoErro.AVISO) != null && mapMensagens.get(TipoErro.AVISO).size() > 0);

        wmcListErro.setVisible(mapMensagens.get(TipoErro.ERRO) != null && mapMensagens.get(TipoErro.ERRO).size() > 0);

        wmcListSuccess.setVisible(mapMensagens.get(TipoErro.SUCESSO) != null && mapMensagens.get(TipoErro.SUCESSO).size() > 0);

        CustomFeedbackPanel.this.setVisible(listAlerta.isVisible() || listAviso.isVisible() || listErro.isVisible()
                || listSucesso.isVisible());
        if (target != null) {
            target.add(CustomFeedbackPanel.this);
            target.appendJavaScript("window.scroll(0, 0);");
        }
    }

}
